#include <iostream>
#include <string>
using namespace std;

struct TreeNode
{
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode()
		:val(0)
		,left(nullptr)
		,right(nullptr)
	{}
	TreeNode(int x)
		:val(x)
		,left(nullptr)
		,right(nullptr)
	{}
	TreeNode(int x,TreeNode* left,TreeNode* right)
		:val(x)
		,left(left)
		,right(right)
	{}
};

class Solution
{
public:
	string tree2str(TreeNode* root)
	{
		string str;
		if (root == nullptr)
		{
			return str;
		}
		str += to_string(root->val);

		if (root->left || root->right)
		{
			str += '(';
			str += tree2str(root->left);
			str += ')';
		}

		if (root->right)
		{
			str += '(';
			str += tree2str(root->right);
			str += ')';
		}
		return str;
	}
};

int main()
{
	TreeNode* C = new TreeNode(1);
	TreeNode* A = new TreeNode(2, C, nullptr);
	TreeNode* B = new TreeNode(3);
	TreeNode* root = new TreeNode(1, A, B);

	Solution xz;
	string s = xz.tree2str(root);

	cout << s << endl;
	return 0;
}